package com.kang.c0c.tree;

import java.util.Hashtable;
import java.util.Vector;

import com.kang.c0c.symbol.FunctionSymbol;
import com.kang.c0c.tree.node.BlockNode;
import com.kang.c0c.tree.node.FunctionNode;
import com.kang.c0c.util.Context;

/**
 * 定义抽象语法树的数据结构
 * Tree 由众多的 FunctionNode 组成，存储的形式是哈希表
 * 同时Tree中还存储了各个函数定义的名字 funcNames，以用在生成代码时依序查找各个函数
 * 
 * 抽象语法树的结构为：
 * 	顶层为类Tree, 而Tree则是由一系列的FunctionNode组成 
 * 	FunctionNode 则是由唯一一个自己函数体内的程序序列块 BlockNode 组成
 *	BlockNode 内则是由一系列的其它类子节点组成，其存储数据的方式为向量Vector
 *
 * @author kang
 *
 * Feb 6, 2009
 */
public class Tree {
	private static Context.Key treeKey = new Context.Key();
	
	public static Tree instance(Context context){
		Tree tree = (Tree)context.get(treeKey);
		
		if(tree == null){
			tree = new Tree(context);
		}
		
		return tree;
	}
	
	protected Tree(Context context){
		super();
		context.put(treeKey, this);
		funcTable = new Hashtable<String,FunctionNode>();
		funcNames = new Vector<String>();
	}
	
	private Hashtable<String,FunctionNode> funcTable;
	private Vector<String> funcNames;
	
	public int insertFunction(FunctionNode node){
		funcNames.add(node.getSym().getName());
		funcTable.put(node.getSym().getName(), node);
		return funcTable.size();
	}
	
	public FunctionNode insertFunction(FunctionSymbol sym){
		FunctionNode node = new FunctionNode(sym,new BlockNode());
		insertFunction(node);
		
		return node;
	}
	
	public int size(){
		return funcTable.size();
	}
	
	public FunctionNode getByName(String name){
		return funcTable.get(name);
	}
	
	public String getFunctionName(int i){
		if(i >= funcNames.size())
			return null;
		else
			return funcNames.elementAt(i);
	}
}
